package baseGrammar;

public class string {
    public static void main(String[] args) {

        String a1 = "dfs";
        String a2 = "hgfgfg";
        System.out.println(a1 + a2);//字符串虽然是引用类型，但java处理过，输出不是地址而是值
        //上面一共在堆区中字符串常量池开辟了3个空间，一个是a1，一个是a2，一个是a1+a2

        String a3 = "GFDGF";
        a3 = "dfakljf";
        System.out.println(a3);
        //String是不可变的，a3在堆区开辟了一个空间，然后将a3指向了其他空间，原来的空间被垃圾回收器回收了

        String a4 = new String();//空参构造,里面什么都没有
        System.out.println("@" + a4 + "!");
        //new出来的串不在字符串常量池里，而是在堆区里

        String a5 = new String(a1);//带参构造
        System.out.println(a5);

        char[] c = {'a', 'b', 'c'};
        String a6 = new String(c);//通过字符数组构造
        System.out.println(a6);

        byte[] b = {97, 98, 99};
        String a7 = new String(b);//通过字节数组构造
        System.out.println(a7);
        //应用场景：以后在网络中传输数据，都是以字节的形式传输的，所以需要将字节数组转换为字符串

        //与数组的Arrays类需要单独导入包不同，字符串类String不需要单独导入包
        //String类属于lang包，自己自带了相关操作方法
        //串是引用类型，对于 s1=s2 比较的是他们的地址，而不是值，所以需要方法
        String s1 = "abc";
        String s2 = "abc";
        boolean res = s1.equals(s2);//比较值
        System.out.println(res);//true

        String s3 = new String("ABC");
        res = s3.equalsIgnoreCase(s2);//忽略大小写比较值
        System.out.println(res);//true

        //遍历字符串的两种方法
        for (var m : s3.toCharArray()) {//tocharArray() 方法将字符串转换为字符数组
            System.out.print(m + " "); //A B C
        }

        System.out.println();

        for (int i = 0; i < s3.length(); i++) {//length() 方法返回字符串的长度
            System.out.print(s3.charAt(i) + " ");//charAt() 方法返回指定索引处的字符


        }
    }

}